import {
  login,
  getInfo,
  getUserDetailById
} from '@/api/user'
import {
  setToken,
  getToken,
  removeToken,
  setTimeStamp
} from '@/utils/auth'
import {
  resetRouter
} from '@/router'
export default {
  namespaced: true,
  state: {
    // 从cookie缓存中获取token数据
    token: getToken(), // 用户的登录状态
    userInfo: {} // 定义一个空的对象 不是null 因为后边我要开发userInfo的属性给别人用  userInfo.name和头像
  },
  getters: {
    myToken: state => state.token + '哈哈哈哈'
  },
  mutations: {
    // 设置token
    SET_TOKEN(state, token) {
      state.token = token
      // vuex变化 => 缓存数据
      setToken(token) // vuex和 缓存数据的同步
    },
    // 删除token
    REMOVE_TOKEN(state) {
      state.token = null
      // vuex变化 => 缓存数据
      removeToken()
    },
    // 设置用户基本信息
    SET_USERINFO(state, userInfo) {
      state.userInfo = {
        ...userInfo
      } // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
    },
    // 删除用户信息
    REMOVE_USERINFO(state) {
      state.userInfo = {}
    }
  },
  actions: {
    // 异步登录
    login(context, payload) {
      // 为了让组件在调用actions方法时，能够知道成功或者失败并能够使用try..catch或者then..catch来捕获异常，所以我们需要返回一个Promise对象才行
      return new Promise((resolve, reject) => {
        // 调登录api
        login(payload).then(result => {
          // 存储token到vuex中
          context.commit('SET_TOKEN', result)
          // 写入时间戳
          setTimeStamp() // 将当前的最新时间写入缓存
          // 成功
          resolve()
        }).catch(err => {
          // 失败
          reject(err)
        })
      })
    },
    // 获取用户基本资料
    async getUserInfo(context) {
      // 获取用户基本资料
      const result = await getInfo()
      // 获取用户基本信息
      const info = await getUserDetailById(result.userId)
      // 将两个接口结果合并
      const baseResult = {
        ...result,
        ...info
      }
      // 设置vuex数据
      context.commit('SET_USERINFO', baseResult)
      return baseResult // 为了在permission.js中使用ascyn 和 await
    },
    // 退出登录
    logout(context) {
      //  删除用户信息
      context.commit('REMOVE_USERINFO')
      // 删除token
      context.commit('REMOVE_TOKEN')
      // 重置路由
      resetRouter()
      // 清空permission模块中的routes数据
      // 调用permission模块中的setRoutes()这个mutations方法
      context.commit('permission/setRoutes', [], {
        root: true // root设置为true代表context就是全局的context
      })
    }
  }

}
